#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

//改造冒泡排序的函数为qsort函数

//void Swap(char* buf1, char* buf2, int width)
//{
//	int i = 0;
//	for (i = 0; i < width; i++)
//	{
//		int temp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = temp;
//		buf1++;
//		buf2++;
//	}
//}
//
//void my_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
//{
//	size_t i = 0;
//	size_t j = 0;
//
//	for (i = 0; i < sz - 1; i++)
//	{
//		for (j = 0; j < sz - 1 - i; j++)//从小到大排序
//		{
//			//int temp = 0;
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
//			{
//				//交换
//				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//			}
//		}
//	}
//}
//struct stu 
//{
//	char name[10];
//	int age;
//};
//int cmp_struct(const void* e1, const void* e2)
//{
//	//用年龄来排大小
//	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
//}
//int main()
//{
//		//应用于结构体
//	struct stu s[3] = { {"zhangsan",40},{"lisi",34},{"wanger",50}};
//	int sz = sizeof(s) / sizeof(s[0]);
//	my_sort(s,sz,sizeof(s[0]),cmp_struct);
//	return 0;
//}



//void Swap(char* buf1, char* buf2, int width)
//{
//	int i = 0;
//	for (i = 0; i < width; i++)
//	{
//		int temp = *buf1;
//		*buf1 = *buf2;
//		*buf2 = temp;
//		buf1++;
//		buf2++;
//	}
//}
//
//void my_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1, const void* e2))
//{
//	size_t i = 0;
//	size_t j = 0;
//
//	for (i = 0; i < sz - 1; i++)
//	{
//		for (j = 0; j < sz - 1 - i; j++)//从小到大排序
//		{
//			//int temp = 0;
//			if (cmp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)
//			{
//				//交换
//				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
//			}
//		}
//	}
//}
//struct stu
//{
//	char name[10];
//	int age;
//};
//int cmp_struct(const void* e1, const void* e2)
//{
//	//用姓名来排大小
//	return strcmp(((struct stu*)e1)->name,((struct stu*)e2)->name);
//}
//int main()
//{
//	//应用于结构体
//	struct stu s[3] = { {"zhangsan",40},{"lisi",34},{"wanger",50} };
//	int sz = sizeof(s) / sizeof(s[0]);
//	my_sort(s, sz, sizeof(s[0]), cmp_struct);
//	return 0;
//}

//指针数组，是一个数组，


//int main()
//{
//	int aa[2][5] = { 10,9,8,7,6,5,4,3,2,1 };
//	//              10,9,8,7,6
//	//				5,4,3,2,1
//	int* ptr1 = (int*)(&aa + 1);//&aa,整个数组的地址，+1后，然后强制转换为int*
//	int* ptr2 = (int*)(*(aa + 1));//aa数组中首元素的地址
//	printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));
//	return 0;
//}



//int arr[3][5] = { 1,2,3,4,5,6,7,8,9,10 };
//1，2，3，4，5
//6，7，8，9，10
//print_arr(arr, 3, 5);


//int main()
//{
//	int a[5] = { 5, 4, 3, 2, 1 };
//	int* ptr = (int*)(&a + 1);//&a表示为整个数组的地址
//	printf("%d,%d", *(a + 1), *(ptr - 1));
//	return 0;
//}


//作业标题(1368)
//qsort使用练习
//作业内容
//练习使用库函数，qsort排序各种类型的数据
//使用整型
//int cmp_int(const void* e1, const void* e2)
//{
//	return (*(int*)e1) - (*(int*)e2);
//}
//int main()
//{
//	int arr[10] = {10,9,8,7,6,5,4,3,2,1};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	//qsort(arr,sz,width,cmp_int);
//	qsort(arr, sz, sizeof(arr[0]), cmp_int);
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ",arr[i]);
//	}
//	return 0;
//}
//
////使用结构体中的int型
//struct stu 
//{
//	char name[10];
//	int age;
//};
//
//int cmp_age(const void* e1, const void* e2)
//{
//	return ((struct stu*)e1)->age - ((struct stu*)e2)->age;
//}
//int main()
//{
//	struct stu s[3] = { {"zhangsan",45},{"lisi",60},{"wanger",30}};
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s, sz, sizeof(s[0]), cmp_age);
//	return 0;
//}
//
//
////使用结构体中的名字进行排序
//struct stu 
//{
//	char name[10];
//	int age;
//};
//int cmp_name(const void* e1, const void* e2)
//{
//	return strcmp(((struct stu*)e1)->name, ((struct stu*)e2)->name);
//}
//int main()
//{
//	struct stu s[3] = { {"zhangsan",45},{"lisi",23},{"wanger",67}};
//	int sz = sizeof(s) / sizeof(s[0]);
//	qsort(s,sz,sizeof(s[0]),cmp_name);
//	return 0;
//}


//作业标题(1372)
//qsort模拟实现
//作业内容
//模仿qsort的功能实现一个通用的冒泡排序
//利用这个仿qsort函数,来实现数组元素的排序
//先来实现一个冒泡对一个数组的排序

void sort(int* p, int sz)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < sz-1; i++)
	{
		for (j = 0; j < sz-1-i; j++)
		{
			if (*(p + j) > *(p + j + 1))
			{
				int temp = 0;
				temp = *(p + j);
				*(p + j) = *(p + j + 1);
				*(p + j + 1) = temp;
			}
		}
	}
	
}
int main()
{
	int arr[10] = {10,9,8,7,6,5,4,3,2,1};
	int sz = sizeof(arr) / sizeof(arr[0]);
	sort(arr, sz);
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

	return 0;
}
